% \documentclass{memoir}
% \pagestyle{empty} % 移除页眉页脚
% \setlrmarginsandblock{0pt}{0pt}{*} % 左右边距设为 0
% \setulmarginsandblock{0pt}{0pt}{*} % 上下边距设为 0
% \checkandfixthelayout % 应用布局设置
\documentclass{article}
% \documentclass{standalone}
\usepackage{geometry}
\geometry{
    % a4paper,.
    top=1cm,
    % top=2.2cm, bottom=2.2cm, 
    bottom=1cm,
    left=0cm, right=0cm,
    % heightrounded,
    % totalheight=infinite,  % 理论上允许无限高度（需谨慎使用）
    % totalheight=\maxdimen  % 理论上允许无限高度（需谨慎使用）
}

\pagestyle{empty} %取消页码数
% \usepackage{adjustbox}
% % 临时调整页面高度
% \newgeometry{
%     top=2.2cm, bottom=2.2cm, 
%     left=3.5cm, right=3.5cm,
%     totalheight=\maxdimen  % 理论上允许无限高度（需谨慎使用）
% }

% \usepackage{atveryend} % 用于在文档末尾执行命令

% \AtVeryEndDocument{
%   \pdfpageheight=\document % 将页面高度设为内容实际高度
% }
% \AllowBreak % 也可在关键位置手动添加，建议全局使用

% \checkandfixthelayout
% \documentclass[a4paper]{article}
\usepackage[linesnumbered,ruled,vlined,algo2e]{algorithm2e}
% \usepackage[linesnumbered,ruled,vlined,algo2e,breakable]{algorithm2e}
% \SetAlgoLined：增添end行
% \DontPrintSemicolon：不显示行末尾的分号
% \SetKwInput{KwInput}{Input}：设置输入
% \SetKwInOut{KwInput}{Input}：设置输入输出
% ruled：标题左对齐，顶部和底部各添加一条线
% linesnumbered：显示行编号
\usepackage{ctex} %注意，这里必须引入ctex,否则中文内容无法输出
\SetKwRepeat{Do}{do}{while}
\SetKwFunction{Try}{try}
\SetKwFunction{Catch}{catch}
% \SetKwProg{TryCatch}{Try}{Catch}{}

% \setmainfont{Times New Roman}
% % \setmainfont{SimHei}
% \setCJKmainfont{SimSun}

\begin{document}
% \begin{adjustbox}{max totalsize={\textwidth}{\textheight}}
\begin{algorithm2e}[htbp]
    \SetAlgoLined
    \renewcommand{\thealgocf}{4-4} %自定义算法编号
    \caption{API文档节点信息提取算法}
    \SetKwInOut{KwIn}{\textbf{输入}}
    \SetKwInOut{KwOut}{\textbf{输出}}	

    \KwIn{API file path corresponding to generating function:$api\_file\_path$;\\
    the name of the selected function:$function\_name$}
    \KwOut{dictionary structure of containing API information:$analysis\_dict$}

    analysis\_dict $\gets$ Empty //创建空的API节点信息字典结构\\
    \If{api\_file\_path is Empty $OR$ api\_file\_path is None}{
        //这里对未生成API文档路径的进行处理，并返回空值
    }

    % \If{}{}
    doc=pq(filename=api\_file\_path) //pq解析API文档\\
    function\_node=doc.find("\#")+function\_name //获取对应函数节点 \\

    function\_sig=function\_node.find(".attr.function").remove('a') //获取函数签名对应节点 \\
    % 检查是否存在函数签名节点
    \If{check\_node(function\_sig)}{
        child\_nodes=function\_sig.children() //获取函数签名节点所有子节点 \\
        function\_sig\_content=Empty\\

        \ForEach{it $in$ child\_nodes}{
            \eIf{it.classes.\_attributes.get('class') $==$ "decorator"}
            {
                function\_sig\_content+=f"\{it.text\_content()\}\{os.linesep\}"
                //获取函数签名修饰符,并添加换行分隔符
            }{
                function\_sig\_content+=it.text\_content()+" " //直接组合函数签名内容，并添加空白空隔符\\
                }
        }
        % \AllowBreak % 手动添加跨页点（可选
        \{key:'function\_sig',value:function\_sig\_content\}  $\rightarrow$ analysis\_dict //添加函数签名信息到返回字典结构 \\
    }
    function\_docstring=function\_doc.find(".docstring") //查找文档字符串节点 \\
    \If{check\_node(function\_docstring)}{
        % function_returns=function_docstring.find("#returns") //查找返回值描述节点
        function\_returns=function\_docstring.find("\#returns") //查找返回值描述节点 \\
        \If{check\_node(function\_returns)}{
            \{key:'returns',value:function\_returns.next().text()\}  $\rightarrow$ analysis\_dict \\ %//添加返回值描述信息到返回字典结构,注意需要先查找下一个节点，再获取内容 \\
            Add\_Class('find\_end') $\rightarrow$ function\_returns    //对已查找到的return值描述，通过添加类节点的方法，作为标记 \\   
        }
        % // 获取函数使用案例-example: \\
        % function\_api\_usage=function\_docstring.find(".pdoc-code.codehilite") \\
        % % api_usage_list=[]
        % api\_usage:List \\
        % \For{it in function\_api\_usage.items()}{
        %     api\_usage.Append(it.text())
        % }
        % \{key:'api\_usage\_example',value:JSON.dumps(api\_usage)\}  $\rightarrow$ analysis\_dict //函数使用案例以JSON格式存储 \\

        function\_parameters=function\_docstring.find("\#parameters") \\
        \If{check\_node(function\_parameters)}{ 
            \{key:'parameters',value:function\_parameters.next().text()\}  $\rightarrow$ analysis\_dict //函数参数说明添加 \\
            Add\_Class('find\_end') $\rightarrow$ function\_parameters   //通过添加类节点的方法，作为标记，以解析docstring \\  
            % function\_parameters.add\_class('find\_end') \\
        }
    }



    % % 真正的函数体：
    % \SetKwFunction{FMain}{analysis\_API\_document}
    % \SetKwProg{Fn}{Function}{}{}
    % \Fn{\FMain{self,library\_name,file\_name,function\_name,file\_path}}{
    %     out\_path $\gets$ Join(self.document\_hub\_path,library\_name) \\
    %     \textbf{try:} \\
    %     \Indp subprocess.check\_call([sys.executable, "-m", "pdoc","--no-show-source","-o", out\_path,file\_path]) \\
    %     \Indm
    %     \textbf{catch:} subprocess.CalledProcessError \\
    %         \Indp 
    %          \tcp{报错信息写入log日志文件} 
    %          \Indm
    %     module\_name $\gets$ Split(file\_name, ".")[0] \\
    %     file\_path\_prefix $\gets$  Split(file\_path, ".")[0] \\
    %     % directory\_name=file\_path\_prefix("src/","").replace('lib/',"").replace(f"\{self.repo_path\}/\{library_name\}/","")
    %     candidate\_paths="out\_path"+Combination() //获取所有候选路径，进行API文档探测
    %     doc\_path=None
    %     \ForEach{candidate\_path in candidate\_paths}{
    %     \If{check\_node\_exists(path,function\_name) is exists}
    %     {
    %         %   sub $\gets$ a - b
    %         % \Return{True}\\
    %         doc\_path $\gets$  candidate\_path \\
    %         \textbf{break}
    %     }
    %     }
    % }\textbf{end}
    % 主体函数结束

    % 副函数开始
    \SetKwFunction{FMain}{check\_node}
    \SetKwProg{Fn}{Function}{}{}
        \Fn{\FMain{self,node}}{
            \eIf{node is Empty $OR$ node is None}
            {
                % %   sub $\gets$ a - b
                % doc=pq(filename=file\_path)\\
                % function\_node=doc.find("\#"+function\_name)\\
                % \If{function\_node is exists}
                % {
                %     %   sub $\gets$ a - b
                    \Return{False}
                % }
            }            % \Else
            {
                \Return{True}
            }
        }\textbf{end}
% \end{adjustbox}
\end{algorithm2e}
\end{document}    